package tcpVerwaltung;

import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JOptionPane;

import tcpVerbindung.SendenString;
import tcpVerbindung.utils;
import verwaltung.Model;

public class TCPverbindung implements Observer {

	private Model model;

	private Thread thEmpfangen;

	//private String ip = "192.168.1.1";
	// private String ip = "192.168.1.43";
	 private String ip = "127.0.0.1";
	private int port = 8392;

	private java.net.Socket socket;

	private boolean verbindungAufgebaut;

	/**
	 * Konstruktor
	 * 
	 * @param modVerwArtikel
	 */
	public TCPverbindung(Model model) {

		this.model = model;
		this.model.addObserver(this);

		socket = new java.net.Socket();

		thEmpfangen = new Thread(new Runnable() {

			@Override
			public void run() {

				while (true) {

					tcpEmpfangen();

					try {
						Thread.sleep(25);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
			}
		});

		// TCP Verbindung aufbauen
		tcpAufbauen();

	}

	private void tcpAufbauen() {

		try {
			socket = utils.verbindungAufbauen(ip, port);

			verbindungAufgebaut = true;

		} catch (UnknownHostException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//
			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung",
					JOptionPane.YES_OPTION);

			verbindungAufgebaut = false;
		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//
			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung",
					JOptionPane.YES_OPTION);

			verbindungAufgebaut = false;
		}

		// Nur starten wenn Verbindung OK
		if (verbindungAufgebaut) {
			// Threads starten
			thEmpfangen.start();
		}

	}

	/**
	 * Daten senden
	 * 
	 * @throws IOException
	 */
	private void tcpSenden() {

		try {
			SendenString.datenSenden(socket, model.datenSenden());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Daten Empfangen
	 * 
	 * @throws IOException
	 */
	@SuppressWarnings("deprecation")
	private void tcpEmpfangen() {

		try {
			model.datenAuswerten(utils.datenEmpfangen(socket, 400));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung",
					JOptionPane.YES_OPTION);

			verbindungAufgebaut = false;

			thEmpfangen.stop();
		}

	}

	@Override
	public void update(Observable o, Object arg) {
		if (model == o) {

			// Bei Aenderung IO's
			if (arg.equals("ioSenden")) {
				tcpSenden();
			}

			// Bei Aenderung Parameter
			if (arg.equals("neueEingabe")) {
				tcpSenden();
			}

		}

	}
}